home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource4 / 280_01 / makpat.c < prev    next >
Text File  |  1989-01-13  |  3KB  |  99 lines

  1. /* [makpat.c of JUGPDS Vol.17] */
  2. /*
  3. *****************************************************************
  4. *                                *
  5. *    Written by  Hakuo Katayose (JUG-CP/M No.179)        *
  6. *            49-114 Kawauchi-Sanjuunin-machi        *
  7. *            Sendai, Miyagi 980                          *
  8. *            Phone: 0222-61-3219                *
  9. *                                *
  10. *       Modifird by Toshiya Oota   (JUG-CPM No.10)              *
  11. *                   Sakae ko-po 205                 *
  12. *            5-19-6 Hosoda                *
  13. *            Katusikaku Tokyo 124            *
  14. *                                *
  15. *        for MS-DOS Lattice C V3.1J & 80186/V20/V30    *
  16. *                                *
  17. *    Compiler Option: -ccu -k0(1) -ms -n -v -w        *
  18. *                                *
  19. *    Edited & tested by Y. Monma (JUG-CP/M Disk Editor)    *
  20. *            &  T. Ota   (JUG-CP/M Sub Disk Editor)    *
  21. *                                *
  22. *****************************************************************
  23. */
  24.  
  25. /* Library functions for Software Tools */
  26.  
  27. #include "stdio.h"
  28. #include "dos.h"
  29. #include "ctype.h"
  30. #include "tools.h"
  31.  
  32. /* makpat - make pattern from arg[from], terminate at delim */
  33. int  makpat(arg, from, delim, pat)
  34. char    delim, arg[], pat[];
  35. int    from;
  36.  
  37. {
  38. int    i, j, lastj, lastcl, lj, len, k, kk[10], dp;
  39. char    c;
  40. int  addset();
  41. void _copy();
  42.  
  43.     j = 0; lastj = 0; lastcl = 0;
  44.     k = '1'; dp = 0;
  45.     for (i = from; arg[i] != delim && arg[i] != EOS; i++) {
  46.         lj = j;
  47.         c = arg[i];
  48.         if (c == NPAT) {
  49.             addset(BPAT, pat, &j, MAXSET);
  50.             addset(k, pat, &j, MAXSET);
  51.             kk[dp++] = k++;
  52.             }
  53.         else if (c == NPATEND) {
  54.             addset(EPAT, pat, &j, MAXSET);
  55.             addset(kk[--dp], pat, &j, MAXSET);
  56.             }
  57.         else if (c == ANY) {
  58.             addset(ANY, pat, &j, MAXSET);
  59.             }
  60.         else if (c == BOL && i ==from) {
  61.             addset(BOL, pat, &j, MAXSET);
  62.             }
  63.         else if (c == EOL && arg[i+1] == delim) {
  64.             addset(EOL, pat, &j, MAXSET);
  65.             }
  66.         else if (c == CCL) {
  67.             if (getccl(arg, &i, pat, &j) == ERROR) break;
  68.             }
  69.         else if ((c == CLOSURE || c == PLUS) && i > from) {
  70.             lj = lastj;
  71.             if (pat[lj] == BOL ||
  72.                 pat[lj] == EOL || 
  73.                 pat[lj] == CLOSURE)
  74.                 break;
  75.             if (c == PLUS) {
  76.                 len = j - lj;
  77.                 _copy(&pat[lj], &pat[j], len);
  78.                 j += len;
  79.                 lj += len;
  80.                 lastj += len;
  81.                 }
  82.             lastcl = stclos(pat, &j, lastj, lastcl);
  83.             }
  84.         else {
  85.             addset(CHAR, pat, &j, MAXSET);
  86.             addset(esc(arg, &i), pat, &j, MAXSET);
  87.             }
  88.         lastj = lj;
  89.         }
  90.     if (arg[i] != delim)
  91.         return ERROR;
  92.     if (j >= MAXSET)
  93.         return ERROR;
  94.     if (dp < 0)
  95.         return ERROR;
  96.     pat[j] = EOS;
  97.     return( (int) (k - '1') );
  98. }
  99.